﻿#pragma once
#include <stdint.h>
#include "GameItemDef.h"
#include "ActTableData.h"
#include <map>
//玩家
class LogicUser;

//协议
namespace ProtoMsg
{
	class ActDetailData;
	class Msg_Act_TakeReward_CS;
	class Msg_Act_TakeReward_SC;
};

class ActBase
{
public:
	ActBase(uint32_t iActType, LogicUser& stUser);
	virtual ~ActBase();

public:
	//检查活动在客户端界面是否可以显示
	virtual bool checkCanShow(const ActTableData& stActTableData) { return false; }

	// 检查具体活动里面, 是否可参加的限制
	virtual bool checkCanJoin(const ActTableData& stActTableData) { return false; }

	// 检查集体活动里面, 是否有奖励可领
	virtual bool checkHasReward(const ActTableData& stActTableData) { return false; }

	// 根据类型, 填充活动进度
	virtual void fillActDetailData(const ActTableData& stActTableData, ProtoMsg::ActDetailData* pActDetailData) = 0;

	// 领取奖励
	virtual int32_t takeReward(ProtoMsg::Msg_Act_TakeReward_CS& msgRequest, ProtoMsg::Msg_Act_TakeReward_SC& msgResponse) = 0;

protected:

	// 刷新玩家活动数据
	virtual void refreshUsrActData(const ActTableData& stActTableData);

	// 获取玩家活动数据
	JceData::UserActData* getUserActData(const ActTableData& stActTableData);

protected:
	uint32_t 			_iActType;
	LogicUser& 		_stUser;
};

struct RewardInfo
{
	ItemKeyVec vItem;
	HeroKeyVec vHero;
	uint32_t iActive;
};
//解析活动奖励
int32_t parseReward(const Json::Value& jsonServerParm, map<uint32_t, RewardInfo>& mRewardInfo);


/************************************************************************/
/*		用于标题类型活动是否有奖励或者开启是由内部若干子活动决定			*/
/************************************************************************/
class ActTitleBase :public ActBase
{
public:
	ActTitleBase(uint32_t iActType, LogicUser& stUser);
	~ActTitleBase();
	virtual bool checkCanShow(const ActTableData& stActTableData);
	virtual bool checkCanJoin(const ActTableData& stActTableData);
	virtual bool checkHasReward(const ActTableData& stActTableData);
	void setShowType(uint32_t iShowTYpe) { _iSubActShowType = iShowTYpe; }
private:
	uint32_t				_iSubActShowType;
};